package com.tedu.api.io;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Copy;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * RandomAccessFile
 * 专门解决File无法实现读写的操作类【数据传输】，底层使用C完成
 * 【使用方法并不方便】
 * RandomAccessFile构造器使用
 * new RandomAccessFile("文件”使用)
 * RandomAccessFile方法的使用:读，写操作
 * 需求：实现音乐 C  V 复制  粘贴
 */
public class RandomAccessFileAPI {
    @Test
    public void testWrite() throws IOException {
        //创建RAF类：在API 项目文件夹下 直接创建raf.txt文件，模式：读写
        RandomAccessFile raf=
                new RandomAccessFile("raf.txt","rw");
        /**
         * write()
         * 作用：写出一个字节，将给定的int值对应2进制的“低八位”写出
         * 该方法有异常，范围：0~255之间---写入ASCII码【接近底层】
         * 出现异常：抛出IO异常---有可能存在文件无法写出的情况
         */
        raf.write(97); //a
        raf.write(98);
        raf.write(101);
        //关闭 流  closed()
        raf.close();
    }

    @Test
    public void testRead() throws IOException {
        //创建RAF类---模式： 读
        RandomAccessFile raf=
                new  RandomAccessFile("raf.txt","r");
        /**
         * read()
         * 作用：读取一个字节，返回10进制值
         *      如果返回值-1，代表读取末尾
         * 抛出IO异常
         */
        int a=raf.read();
        int b=raf.read();    int e=raf.read();
        System.out.println("读取到："+a+","+b+","+e);

    }

    //需求：实现音乐 C V 复制 粘贴
    @Test
    public void testCopy() throws IOException {
        //1.被复制的文件--复制操作---模式：r
        RandomAccessFile src=
    new RandomAccessFile("2023冠军.mp3","r");
        //1.复制出来的新文件--粘贴操作---模式：rw
        RandomAccessFile desc=
    new RandomAccessFile("6.mp3","rw") ;

    //2.创建变量类型：int类型--用于保存读取/写出的每个字节
        int temp=-1; //读取：读到-1代表文件数据读完了
        //5.【一个一个字节的读---一个字节一个字节写】 测运行效率
        long start=System.currentTimeMillis(); //系统时间：毫秒数

    //3.从"TICKING-AWAY(2023walolant).mp3"--读到每个字节
    //--写出到“TICKING-AWAY.mp3”
    //思考：一直从“TICKING-AWAY(2023walolant).mp3”读到所有字节
    //从“TICKING-AWAY(2023walolant).mp3”读到所有字节，只要不是末尾！=-1
        while((temp=src.read())!=-1){ //如果有数据:true
    //4.写出[TICKING-AWAY.mp3]每个字节
           desc.write(temp);//读入temp数据写出write中
        }
        long end=System.currentTimeMillis(); //系统时间：毫秒数
        //6.关闭流
        src.close(); desc.close();
        //7.读取花费时间
        System.out.println("读取花费时间："+(end-start)/1000+"秒数");


    }

    //需求：实现音乐 C V 复制 粘贴
    /**
     * 读写按照一个字节操作---效率低
     *
     * 1024 程序员节
     * 1 字节=8位二进制
     * 0    0000 0000
     * 1    0000 0001
     * 2    0000 0010
     * 6    0000 0110
     *  1024 字节=1KB
     *  1024 KB=1MB
     *  1024 MB=1G
     *  1024  G=1T
     * 读写按照100KB 操作--效率低
     */
    @Test
    public void testRW() throws IOException {
        //1.被复制的文件---视频--占用空间大
        RandomAccessFile src=
                new  RandomAccessFile("复制文件.MP4","r");
        //1.1复制的文件---视频.mp4
        RandomAccessFile desc=
                new  RandomAccessFile("视频.MP4","r");
                //2.保存每次读取的字节量
        int len=-1;
        /**重载
         * read() 一个字节一个字节读
         * read(字节数组) 实现根据子集指定的 100KB 方式读取字节
         *
         */
        //3.定义字节数组----100KB
        byte[] data=new byte[1024*100];
        //4.开始一直从”复制文件.mp4“获取
        //(len=src.read(data))!=-1  判断条件
        while((len=src.read(data))!=-1){
            /**重载
             * write(int i) 写出一个字节
             * write（字节数组，读取开始：0，读取结束：-1）
             * 作用：写出字节数组：指定大小 100KB的文件
             * 从0开始，写出到-1结束
             *
             */
            //5.按照100KB  写出”视频.mp4“文件
            desc.write(data,0,len);
            //6.关闭流
            //7.子集测复制的时间
        }
    }
}
